package main

import (
	"fmt"
)

func main() {
	res := intSum(1, 2)
	fmt.Println(res)

	// 匿名函数，没有名字的函数
	//场景： 这段代码只在此处使用，不想被别的函数调用；或一段代码需要并发的时候使用. 写出来之后必须被使用
	//	第一种匿名函数方式
	func(n1, n2 int) int {
		fmt.Println(n1 - n2)
		return n1 - n2
	}(2, 1)
	//第二种匿名函数方式
	test_func := func(n1, n2 int) int {
		return n1 - n2
	}
	res1 := test_func(6, 5)
	fmt.Println(res1)

	fn := AddInt()
	fmt.Println(fn(1), "bibao")
}

// 函数语法： func 函数名 (接收参数 其类型) （返回值 其类型） { 函数体 }
// 返回值书写的不同方式：(a int)   (int)    (int,error)    (a int, err error)  (a, b int)
func intSum(x, y int) (a int) {
	a = x + y
	return a
}

// 不添加返回值，场景：方法中使用、数据处理
// 数据处理
var m int

func tesSum(a, b int) {
	m = a * b
}

// 闭包：避免函数的内部环境被外部污染
// func(i int) int是1个返回值，闭包的返回值是个匿名函数
// 闭包中的变量在函数调用完毕后不会被销毁
func AddInt() func(i int) int {
	var num int
	return func(i int) int {
		num += 1
		return num
	}
}

//变量作用域
//函数外的全局变量
//函数内的局部变量
//循环内的变量
